﻿2026-05-14T10:09:58.9559199Z ##[group]Run pnpm verify:phase-5
2026-05-14T10:09:58.9559520Z [36;1mpnpm verify:phase-5[0m
2026-05-14T10:09:58.9592466Z shell: /usr/bin/bash -e {0}
2026-05-14T10:09:58.9592716Z env:
2026-05-14T10:09:58.9592968Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-14T10:09:58.9593293Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-14T10:09:58.9593520Z   SKIP_TRACE_CHECK: 1
2026-05-14T10:09:58.9593731Z ##[endgroup]
2026-05-14T10:09:59.2588540Z 
2026-05-14T10:09:59.2589307Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-14T10:09:59.2590356Z > node scripts/verify-phase-5.mjs
2026-05-14T10:09:59.2590962Z 
2026-05-14T10:09:59.2893952Z 
2026-05-14T10:09:59.2894644Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-14T10:09:59.2895829Z >>> pnpm verify:phase-4
2026-05-14T10:09:59.6595181Z 
2026-05-14T10:09:59.6596657Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-14T10:09:59.6597779Z > node scripts/verify-phase-4.mjs
2026-05-14T10:09:59.6598392Z 
2026-05-14T10:09:59.6890640Z 
2026-05-14T10:09:59.6891205Z === Workspace: typecheck ===
2026-05-14T10:09:59.6892018Z >>> pnpm -r typecheck
2026-05-14T10:09:59.9941459Z Scope: 5 of 6 workspace projects
2026-05-14T10:09:59.9995925Z packages/db typecheck$ tsc --noEmit
2026-05-14T10:10:00.0004919Z packages/game-logic typecheck$ tsc --noEmit
2026-05-14T10:10:02.7960038Z packages/game-logic typecheck: Done
2026-05-14T10:10:02.7983836Z packages/protocol typecheck$ tsc --noEmit
2026-05-14T10:10:04.3861184Z packages/db typecheck: Done
2026-05-14T10:10:06.0350524Z packages/protocol typecheck: Done
2026-05-14T10:10:06.0357095Z apps/server typecheck$ tsc --noEmit
2026-05-14T10:10:06.0360072Z apps/client typecheck$ tsc --noEmit
2026-05-14T10:10:17.5268597Z apps/client typecheck: Done
2026-05-14T10:10:18.2423328Z apps/server typecheck: Done
2026-05-14T10:10:18.2522148Z 
2026-05-14T10:10:18.2522791Z === Lint: protocol-sync ===
2026-05-14T10:10:18.2523505Z >>> pnpm lint:protocol-sync
2026-05-14T10:10:18.5618395Z 
2026-05-14T10:10:18.5619451Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-14T10:10:18.5620472Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-14T10:10:18.5621000Z 
2026-05-14T10:10:18.5900976Z lint-protocol-sync: OK
2026-05-14T10:10:18.6010987Z 
2026-05-14T10:10:18.6011458Z === Lint: game-logic-purity ===
2026-05-14T10:10:18.6012165Z >>> pnpm lint:game-logic-purity
2026-05-14T10:10:18.9007887Z 
2026-05-14T10:10:18.9009169Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-14T10:10:18.9010023Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-14T10:10:18.9010406Z 
2026-05-14T10:10:18.9347142Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-14T10:10:18.9455968Z 
2026-05-14T10:10:18.9458648Z === Lint: better-auth-schema-sync ===
2026-05-14T10:10:18.9459316Z >>> pnpm lint:better-auth-schema-sync
2026-05-14T10:10:19.2462491Z 
2026-05-14T10:10:19.2463493Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-14T10:10:19.2464798Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-14T10:10:19.2466335Z 
2026-05-14T10:10:20.7224477Z lint-better-auth-schema-sync: OK
2026-05-14T10:10:20.7349147Z 
2026-05-14T10:10:20.7349757Z === Lint: rate-limit-budgets ===
2026-05-14T10:10:20.7350621Z >>> pnpm lint:rate-limit-budgets
2026-05-14T10:10:21.0353154Z 
2026-05-14T10:10:21.0354294Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-14T10:10:21.0356043Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-14T10:10:21.0356764Z 
2026-05-14T10:10:21.0647752Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-14T10:10:21.0762012Z 
2026-05-14T10:10:21.0762538Z === Lint: no-clipboard-rce ===
2026-05-14T10:10:21.0763366Z >>> pnpm lint:no-clipboard-rce
2026-05-14T10:10:21.3805910Z 
2026-05-14T10:10:21.3807051Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-14T10:10:21.3808441Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-14T10:10:21.3809126Z 
2026-05-14T10:10:21.4131389Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-14T10:10:21.4240617Z 
2026-05-14T10:10:21.4241054Z === Lint: room-layout ===
2026-05-14T10:10:21.4241813Z >>> pnpm lint:room-layout
2026-05-14T10:10:21.7234986Z 
2026-05-14T10:10:21.7236057Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-14T10:10:21.7237309Z > node tools/scripts/lint-room-layout.mjs
2026-05-14T10:10:21.7237991Z 
2026-05-14T10:10:21.7566602Z lint-room-layout: OK
2026-05-14T10:10:21.7684872Z 
2026-05-14T10:10:21.7685322Z === ADR 0004 lint ===
2026-05-14T10:10:21.7686191Z >>> pnpm lint:adr:0004
2026-05-14T10:10:22.0669044Z 
2026-05-14T10:10:22.0670043Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-14T10:10:22.0671769Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-14T10:10:22.0672758Z 
2026-05-14T10:10:22.0984910Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T10:10:22.1092581Z 
2026-05-14T10:10:22.1093082Z === Drizzle: emit-check ===
2026-05-14T10:10:22.1093788Z >>> pnpm db:emit-check
2026-05-14T10:10:22.4105706Z 
2026-05-14T10:10:22.4106760Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-14T10:10:22.4109794Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-14T10:10:22.4111996Z 
2026-05-14T10:10:22.8532267Z No config path provided, using default 'drizzle.config.ts'
2026-05-14T10:10:22.8534712Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-14T10:10:23.2101358Z 8 tables
2026-05-14T10:10:23.2102099Z accounts 8 columns 1 indexes 0 fks
2026-05-14T10:10:23.2102991Z audit_log 6 columns 0 indexes 2 fks
2026-05-14T10:10:23.2103860Z characters 9 columns 0 indexes 1 fks
2026-05-14T10:10:23.2104746Z inventory_items 4 columns 0 indexes 1 fks
2026-05-14T10:10:23.2106062Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-14T10:10:23.2107073Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-14T10:10:23.2107899Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-14T10:10:23.2108789Z sessions 5 columns 0 indexes 1 fks
2026-05-14T10:10:23.2109355Z 
2026-05-14T10:10:23.2110184Z No schema changes, nothing to migrate 😴
2026-05-14T10:10:23.3123126Z 
2026-05-14T10:10:23.3123891Z === Drizzle: schema-sync ===
2026-05-14T10:10:23.3124701Z >>> pnpm lint:schema-sync
2026-05-14T10:10:23.6370156Z 
2026-05-14T10:10:23.6371147Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-14T10:10:23.6374764Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-14T10:10:23.6377946Z 
2026-05-14T10:10:23.6637505Z OK
2026-05-14T10:10:23.6760797Z 
2026-05-14T10:10:23.6761363Z === Drizzle: source-comments ===
2026-05-14T10:10:23.6762150Z >>> pnpm lint:source-comments
2026-05-14T10:10:23.9924645Z 
2026-05-14T10:10:23.9925994Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-14T10:10:23.9927421Z > pnpm -C packages/db run lint:source-comments
2026-05-14T10:10:23.9928121Z 
2026-05-14T10:10:24.3141579Z 
2026-05-14T10:10:24.3142799Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-14T10:10:24.3144277Z > node scripts/check-source-comments.mjs
2026-05-14T10:10:24.3144911Z 
2026-05-14T10:10:24.3481926Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-14T10:10:24.3672905Z 
2026-05-14T10:10:24.3673399Z === Workspace: test ===
2026-05-14T10:10:24.3674255Z >>> pnpm -r test
2026-05-14T10:10:24.6737495Z Scope: 5 of 6 workspace projects
2026-05-14T10:10:24.6791685Z packages/db test$ vitest run
2026-05-14T10:10:24.6801112Z packages/game-logic test$ vitest run
2026-05-14T10:10:25.2017511Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-14T10:10:25.2759127Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-14T10:10:25.6692753Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-14T10:10:25.9152424Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:10:26.1247517Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:10:26.1843794Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T10:10:26.3565709Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 12[2mms[22m[39m
2026-05-14T10:10:26.5694102Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:10:26.7799428Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:10:26.9882350Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:10:27.0531891Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:10:27.2307794Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:10:27.2827902Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:10:27.2926721Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-14T10:10:27.2946743Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-14T10:10:27.2959819Z packages/db test: [2m   Start at [22m 10:10:25
2026-05-14T10:10:27.2977183Z packages/db test: [2m   Duration [22m 2.08s[2m (transform 182ms, setup 0ms, import 1.42s, tests 30ms, environment 1ms)[22m
2026-05-14T10:10:27.3216800Z packages/db test: Done
2026-05-14T10:10:27.3226177Z packages/protocol test$ vitest run
2026-05-14T10:10:27.4497714Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:10:27.6738514Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:10:27.6786955Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-14T10:10:27.6837411Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-14T10:10:27.6850805Z packages/game-logic test: [2m   Start at [22m 10:10:25
2026-05-14T10:10:27.6927117Z packages/game-logic test: [2m   Duration [22m 2.39s[2m (transform 197ms, setup 0ms, import 370ms, tests 89ms, environment 2ms)[22m
2026-05-14T10:10:27.7269736Z packages/game-logic test: Done
2026-05-14T10:10:27.8227134Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-14T10:10:28.1057203Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T10:10:28.2577997Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:10:28.4189002Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:10:28.5664770Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:10:28.5691488Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-14T10:10:28.5702966Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-14T10:10:28.5704467Z packages/protocol test: [2m   Start at [22m 10:10:27
2026-05-14T10:10:28.5706728Z packages/protocol test: [2m   Duration [22m 740ms[2m (transform 107ms, setup 0ms, import 212ms, tests 31ms, environment 1ms)[22m
2026-05-14T10:10:28.6026971Z packages/protocol test: Done
2026-05-14T10:10:28.6031768Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-14T10:10:28.6034376Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-14T10:10:29.1189458Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-14T10:10:29.2181880Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-14T10:10:30.0987730Z apps/server test: {"level":30,"time":1778753430094,"pid":4732,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-14T10:10:30.1013960Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 669[2mms[22m[39m
2026-05-14T10:10:30.1027173Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 554[2mms[22m[39m
2026-05-14T10:10:31.2142961Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-14T10:10:31.2163956Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-14T10:10:31.2667039Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 35[2mms[22m[39m
2026-05-14T10:10:31.2967789Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 248[2mms[22m[39m
2026-05-14T10:10:32.2318418Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-14T10:10:32.2326976Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-91f1XD/rebno.db
2026-05-14T10:10:32.2328427Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:10:32.2329436Z apps/server test: [run-migrations] OK
2026-05-14T10:10:32.2427914Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-14T10:10:32.2432796Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-G11Xo6/rebno.db
2026-05-14T10:10:32.2434280Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:10:32.2436480Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-14T10:10:32.2444909Z apps/server test: [run-migrations] OK
2026-05-14T10:10:32.2516870Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:10:32.2520903Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ay26w2/rebno.db
2026-05-14T10:10:32.2536986Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:10:32.2544551Z apps/server test: [run-migrations] OK
2026-05-14T10:10:32.2547050Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:10:32.2550293Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-ay26w2/rebno.db
2026-05-14T10:10:32.2552763Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:10:32.2554469Z apps/server test: [run-migrations] OK
2026-05-14T10:10:32.2626987Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 53[2mms[22m[39m
2026-05-14T10:10:32.5111404Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 137[2mms[22m[39m
2026-05-14T10:10:32.5321152Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 24[2mms[22m[39m
2026-05-14T10:10:32.8458190Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T10:10:33.1035934Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:10:33.3873210Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-14T10:10:33.6983737Z apps/server test: {"level":40,"time":1778753433695,"pid":4852,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:10:33.7055125Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-14T10:10:33.7121750Z apps/server test: {"level":40,"time":1778753433699,"pid":4852,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:10:33.7143612Z apps/server test: {"level":40,"time":1778753433700,"pid":4852,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:10:33.7167148Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 158[2mms[22m[39m
2026-05-14T10:10:33.9477576Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:10:34.2343460Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T10:10:34.9292602Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 137[2mms[22m[39m
2026-05-14T10:10:35.0318375Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-14T10:10:35.0320174Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ multiple files { path: ['.env.local', '.env'] }
2026-05-14T10:10:35.0321717Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-14T10:10:35.7900684Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:10:35.7987712Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-14T10:10:35.8026534Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-14T10:10:35.8037022Z apps/server test: [2m   Start at [22m 10:10:29
2026-05-14T10:10:35.8063398Z apps/server test: [2m   Duration [22m 6.66s[2m (transform 469ms, setup 0ms, import 3.43s, tests 871ms, environment 2ms)[22m
2026-05-14T10:10:35.8401995Z apps/server test: Done
2026-05-14T10:10:35.9767720Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-14T10:10:36.6880157Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 74[2mms[22m[39m
2026-05-14T10:10:37.3687165Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 40[2mms[22m[39m
2026-05-14T10:10:38.0484633Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-14T10:10:38.7182258Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 19[2mms[22m[39m
2026-05-14T10:10:39.3805894Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:10:40.0516384Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:10:40.8113204Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:10:41.4626462Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:10:42.1164515Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:10:42.7645843Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:10:43.4111888Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:10:44.0637378Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:10:44.7150024Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:10:45.3767248Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:10:46.0156691Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:10:46.6677649Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:10:47.3202658Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:10:47.9720135Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:10:48.6234064Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:10:49.2936552Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:10:49.9532979Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-14T10:10:49.9726890Z apps/client test: [2m Test Files [22m [1m[32m26 passed[39m[22m[90m (26)[39m
2026-05-14T10:10:49.9736955Z apps/client test: [2m      Tests [22m [1m[32m193 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (197)[39m
2026-05-14T10:10:49.9752146Z apps/client test: [2m   Start at [22m 10:10:29
2026-05-14T10:10:49.9763698Z apps/client test: [2m   Duration [22m 20.75s[2m (transform 824ms, setup 65ms, collect 1.22s, tests 1.04s, environment 12.09s, prepare 2.32s)[22m
2026-05-14T10:10:50.1043552Z apps/client test: Done
2026-05-14T10:10:50.1117303Z 
2026-05-14T10:10:50.1117938Z verify-phase-4: OK (12 steps green)
2026-05-14T10:10:50.1221804Z 
2026-05-14T10:10:50.1222285Z === Workspace: typecheck ===
2026-05-14T10:10:50.1223190Z >>> pnpm -r typecheck
2026-05-14T10:10:50.4326860Z Scope: 5 of 6 workspace projects
2026-05-14T10:10:50.4380204Z packages/db typecheck$ tsc --noEmit
2026-05-14T10:10:50.4388923Z packages/game-logic typecheck$ tsc --noEmit
2026-05-14T10:10:52.9505077Z packages/game-logic typecheck: Done
2026-05-14T10:10:52.9536321Z packages/protocol typecheck$ tsc --noEmit
2026-05-14T10:10:55.1512844Z packages/db typecheck: Done
2026-05-14T10:10:56.4243586Z packages/protocol typecheck: Done
2026-05-14T10:10:56.4250522Z apps/client typecheck$ tsc --noEmit
2026-05-14T10:10:56.4253920Z apps/server typecheck$ tsc --noEmit
2026-05-14T10:11:07.6621863Z apps/client typecheck: Done
2026-05-14T10:11:08.5441213Z apps/server typecheck: Done
2026-05-14T10:11:08.5527252Z 
2026-05-14T10:11:08.5527730Z === Lint: deploy-stack ===
2026-05-14T10:11:08.5528520Z >>> pnpm lint:deploy-stack
2026-05-14T10:11:08.8523069Z 
2026-05-14T10:11:08.8524090Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-14T10:11:08.8525402Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-14T10:11:08.8526393Z 
2026-05-14T10:11:08.8850923Z lint-deploy-stack: OK
2026-05-14T10:11:08.8966102Z 
2026-05-14T10:11:08.8966738Z === Lint: deploy-stack test ===
2026-05-14T10:11:08.8967585Z >>> pnpm lint:deploy-stack:test
2026-05-14T10:11:09.1949414Z 
2026-05-14T10:11:09.1950513Z > rebno@0.0.0 lint:deploy-stack:test /home/runner/work/rebno/rebno
2026-05-14T10:11:09.1951779Z > node tools/scripts/lint-deploy-stack.test.mjs
2026-05-14T10:11:09.1952495Z 
2026-05-14T10:11:09.2527092Z PASS: lint-deploy-stack green
2026-05-14T10:11:09.2649835Z 
2026-05-14T10:11:09.2650277Z === ADR 0005 lint ===
2026-05-14T10:11:09.2651018Z >>> pnpm lint:adr:0005
2026-05-14T10:11:09.5644973Z 
2026-05-14T10:11:09.5645956Z > rebno@0.0.0 lint:adr:0005 /home/runner/work/rebno/rebno
2026-05-14T10:11:09.5647145Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0005-deploy-topology.md --no-matrix
2026-05-14T10:11:09.5647849Z 
2026-05-14T10:11:09.5936611Z OK: ADR docs/adr/0005-deploy-topology.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T10:11:09.6048281Z 
2026-05-14T10:11:09.6048732Z === ADR 0006 lint ===
2026-05-14T10:11:09.6049476Z >>> pnpm lint:adr:0006
2026-05-14T10:11:09.9055221Z 
2026-05-14T10:11:09.9056635Z > rebno@0.0.0 lint:adr:0006 /home/runner/work/rebno/rebno
2026-05-14T10:11:09.9058411Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0006-observability-stack.md --no-matrix
2026-05-14T10:11:09.9059438Z 
2026-05-14T10:11:09.9356121Z OK: ADR docs/adr/0006-observability-stack.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-14T10:11:09.9470214Z 
2026-05-14T10:11:09.9470641Z === Workspace: test ===
2026-05-14T10:11:09.9471337Z >>> pnpm -r test
2026-05-14T10:11:10.2572104Z Scope: 5 of 6 workspace projects
2026-05-14T10:11:10.2626724Z packages/db test$ vitest run
2026-05-14T10:11:10.2634802Z packages/game-logic test$ vitest run
2026-05-14T10:11:10.7651253Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-14T10:11:10.7669654Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-14T10:11:11.1478868Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:11:11.4024508Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-14T10:11:11.6290685Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-14T10:11:11.7351650Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-14T10:11:11.8607414Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:11:12.0767624Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:11:12.2917384Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:11:12.4951955Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:11:12.5928580Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:11:12.7297628Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:11:12.8377811Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:11:12.8426587Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-14T10:11:12.8446701Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-14T10:11:12.8457886Z packages/db test: [2m   Start at [22m 10:11:10
2026-05-14T10:11:12.8486923Z packages/db test: [2m   Duration [22m 2.07s[2m (transform 192ms, setup 0ms, import 1.42s, tests 30ms, environment 1ms)[22m
2026-05-14T10:11:12.8726717Z packages/db test: Done
2026-05-14T10:11:12.8737220Z packages/protocol test$ vitest run
2026-05-14T10:11:12.9525916Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:11:13.1727758Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:11:13.1786751Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-14T10:11:13.1849029Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-14T10:11:13.1886552Z packages/game-logic test: [2m   Start at [22m 10:11:10
2026-05-14T10:11:13.1941767Z packages/game-logic test: [2m   Duration [22m 2.40s[2m (transform 198ms, setup 0ms, import 378ms, tests 89ms, environment 2ms)[22m
2026-05-14T10:11:13.2504979Z packages/game-logic test: Done
2026-05-14T10:11:13.3400806Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-14T10:11:13.6187584Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-14T10:11:13.7821304Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:11:13.9404505Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:11:14.0936465Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:11:14.0969306Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-14T10:11:14.0990605Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-14T10:11:14.0992363Z packages/protocol test: [2m   Start at [22m 10:11:13
2026-05-14T10:11:14.0994181Z packages/protocol test: [2m   Duration [22m 750ms[2m (transform 99ms, setup 0ms, import 213ms, tests 31ms, environment 0ms)[22m
2026-05-14T10:11:14.1276433Z packages/protocol test: Done
2026-05-14T10:11:14.1282087Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-14T10:11:14.1284551Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-14T10:11:14.6590599Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-14T10:11:14.7238829Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-14T10:11:15.8127404Z apps/server test: {"level":30,"time":1778753475801,"pid":5836,"hostname":"runnervmrw5os","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-14T10:11:15.8189756Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 828[2mms[22m[39m
2026-05-14T10:11:15.8227050Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 659[2mms[22m[39m
2026-05-14T10:11:16.5158331Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-14T10:11:16.5177281Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-14T10:11:16.5949418Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 235[2mms[22m[39m
2026-05-14T10:11:16.9118292Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-14T10:11:16.9137123Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-0u3RjZ/rebno.db
2026-05-14T10:11:16.9151404Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:11:16.9176472Z apps/server test: [run-migrations] OK
2026-05-14T10:11:16.9360332Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-14T10:11:16.9364571Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-CVPrTm/rebno.db
2026-05-14T10:11:16.9367119Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:11:16.9369557Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-14T10:11:16.9371806Z apps/server test: [run-migrations] OK
2026-05-14T10:11:16.9420832Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:11:16.9446927Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-uFDEeu/rebno.db
2026-05-14T10:11:16.9469082Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:11:16.9473147Z apps/server test: [run-migrations] OK
2026-05-14T10:11:16.9479667Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-14T10:11:16.9482973Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-uFDEeu/rebno.db
2026-05-14T10:11:16.9485753Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-14T10:11:16.9488172Z apps/server test: [run-migrations] OK
2026-05-14T10:11:16.9554892Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 80[2mms[22m[39m
2026-05-14T10:11:17.7161391Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 146[2mms[22m[39m
2026-05-14T10:11:18.0454409Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 82[2mms[22m[39m
2026-05-14T10:11:18.3223221Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-14T10:11:18.6187764Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T10:11:18.8787690Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 132[2mms[22m[39m
2026-05-14T10:11:18.9002624Z apps/server test: {"level":40,"time":1778753478898,"pid":5942,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:11:18.9094019Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-14T10:11:18.9106545Z apps/server test: {"level":40,"time":1778753478902,"pid":5942,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:11:18.9108681Z apps/server test: {"level":40,"time":1778753478902,"pid":5942,"hostname":"runnervmrw5os","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-14T10:11:19.2391769Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-14T10:11:19.4920591Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:11:19.7235007Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:11:19.9568154Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:11:20.0507683Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 128[2mms[22m[39m
2026-05-14T10:11:20.8302024Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-14T10:11:20.8320277Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ override existing { override: true }
2026-05-14T10:11:20.8325882Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-14T10:11:21.3200643Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 102[2mms[22m[39m
2026-05-14T10:11:21.6308155Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:11:21.6416958Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-14T10:11:21.6456746Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-14T10:11:21.6496418Z apps/server test: [2m   Start at [22m 10:11:14
2026-05-14T10:11:21.6498083Z apps/server test: [2m   Duration [22m 6.97s[2m (transform 546ms, setup 0ms, import 3.49s, tests 1.10s, environment 2ms)[22m
2026-05-14T10:11:21.6838474Z apps/server test: Done
2026-05-14T10:11:22.1599194Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 72[2mms[22m[39m
2026-05-14T10:11:22.8489690Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 41[2mms[22m[39m
2026-05-14T10:11:23.5302172Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 32[2mms[22m[39m
2026-05-14T10:11:24.2245779Z apps/client test:  [32m✓[39m src/__test__/player-renderer-spawn-delay.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-14T10:11:24.9293003Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-14T10:11:25.6104277Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:11:26.3452255Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-14T10:11:27.0268122Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-14T10:11:27.6884138Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:11:28.3363454Z apps/client test:  [32m✓[39m src/__test__/boot-font-gate.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:11:28.9751777Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:11:29.6247071Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-14T10:11:30.3003004Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-14T10:11:30.9698714Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-14T10:11:31.6092777Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:11:32.2549338Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:11:32.9132890Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:11:33.5489961Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-14T10:11:34.1867244Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:11:34.8409099Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-14T10:11:35.5014830Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-14T10:11:35.5207024Z apps/client test: [2m Test Files [22m [1m[32m26 passed[39m[22m[90m (26)[39m
2026-05-14T10:11:35.5236878Z apps/client test: [2m      Tests [22m [1m[32m193 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (197)[39m
2026-05-14T10:11:35.5241179Z apps/client test: [2m   Start at [22m 10:11:14
2026-05-14T10:11:35.5257224Z apps/client test: [2m   Duration [22m 20.80s[2m (transform 779ms, setup 57ms, collect 1.21s, tests 1.03s, environment 12.07s, prepare 2.34s)[22m
2026-05-14T10:11:35.6503803Z apps/client test: Done
2026-05-14T10:11:35.6576164Z 
2026-05-14T10:11:35.6576515Z verify-phase-5: OK (7 steps green)
